
#pragma once


struct ListNode {
	int val;
	ListNode *next;
	ListNode(int x) : val(x), next(0) {}
};

class Solution {
public:
	ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
// 		int v = 0, add_val = 0;
// 		ListNode* head = 0;
// 		ListNode* pre = 0;
// 		while (l1!=0 || l2!=0)
// 		{
// 			ListNode* n = new ListNode(0);
// 			if (!head)
// 				head = n;
// 			add_val = v;
// 			if (l1!=0)
// 			{ 
// 				add_val += l1->val;
// 				l1 = l1->next;
// 			}
// 			if (l2!=0)
// 			{
// 				add_val += l2->val;
// 				l2 = l2->next;
// 			}
// 			n->val = add_val > 9 ? add_val - 10 : add_val;
// 			v = add_val > 9 ? 1 : 0;
// 			if (pre)
// 				pre->next = n;
// 			pre = n;	
// 		}
// 		if (v && pre)
// 		{
// 			pre->next = new ListNode(v);
// 		}
// 		return head;

		ListNode* head = nullptr;
		ListNode* pre = nullptr;
		int add_val = 0, flag = 0;
		while (l1 != nullptr && l2 != nullptr)
		{
			ListNode* n = new ListNode(0);
			if (head == nullptr)
				head = n;
			if (pre != nullptr)
				pre->next = n;
			add_val = flag;
			if (l1 != nullptr)
			{
				add_val += l1->val;
				l1 = l1->next;
			}
			if (l2 != nullptr)
			{
				add_val += l2->val;
				l2 = l2->next;
			}
			flag = add_val > 9 ? 1 : 0;
			n->val = flag ? add_val - 10 : add_val;
			pre = n;
		}
		if (flag && pre)
		{
			pre->next = new ListNode(1);
		}
		return head;
	}
};